struct vcpu *led;
int handle;
unsigned long frame = 0, nr_gets = 0;
+ struct page_info *pg;
int rc = GNTST_okay;
u32 old_pin;
u32 act_pin;
spin_unlock(&rd->grant_table->lock);
- if ( !mfn_valid(frame) ||
- (owner = page_get_owner_and_reference(mfn_to_page(frame))) == dom_io )
+ pg = mfn_valid(frame) ? mfn_to_page(frame) : NULL;
+
+ if ( !pg || (owner = page_get_owner_and_reference(pg)) == dom_io )
{
/* Only needed the reference to confirm dom_io ownership. */
- if ( mfn_valid(frame) )
- put_page(mfn_to_page(frame));
+ if ( pg )
+ put_page(pg);
if ( paging_mode_external(ld) )
{
else if ( owner == rd )
{
if ( gnttab_host_mapping_get_page_type(op, ld, rd) &&
- !get_page_type(mfn_to_page(frame), PGT_writable_page) )
+ !get_page_type(pg, PGT_writable_page) )
goto could_not_pin;
nr_gets++;
if ( op->flags & GNTMAP_device_map )
{
nr_gets++;
- (void)get_page(mfn_to_page(frame), rd);
+ (void)get_page(pg, rd);
if ( !(op->flags & GNTMAP_readonly) )
- get_page_type(mfn_to_page(frame), PGT_writable_page);
+ get_page_type(pg, PGT_writable_page);
}
}
}
gdprintk(XENLOG_WARNING, "Could not pin grant frame %lx\n",
frame);
if ( owner != NULL )
- put_page(mfn_to_page(frame));
+ put_page(pg);
rc = GNTST_general_error;
goto undo_out;
}
if ( nr_gets > 1 )
{
if ( !(op->flags & GNTMAP_readonly) )
- put_page_type(mfn_to_page(frame));
- put_page(mfn_to_page(frame));
+ put_page_type(pg);
+ put_page(pg);
}
if ( nr_gets > 0 )
{
if ( gnttab_host_mapping_get_page_type(op, ld, rd) )
- put_page_type(mfn_to_page(frame));
- put_page(mfn_to_page(frame));
+ put_page_type(pg);
+ put_page(pg);
}
spin_lock(&rd->grant_table->lock);
struct domain *ld, *rd;
struct active_grant_entry *act;
grant_entry_t *sha;
+ struct page_info *pg;
rd = op->rd;
goto unmap_out;
}
+ pg = mfn_to_page(op->frame);
+
if ( op->flags & GNTMAP_device_map )
{
if ( !is_iomem_page(act->frame) )
{
if ( op->flags & GNTMAP_readonly )
- put_page(mfn_to_page(op->frame));
+ put_page(pg);
else
- put_page_and_type(mfn_to_page(op->frame));
+ put_page_and_type(pg);
}
}
if ( !is_iomem_page(op->frame) )
{
if ( gnttab_host_mapping_get_page_type(op, ld, rd) )
- put_page_type(mfn_to_page(op->frame));
- put_page(mfn_to_page(op->frame));
+ put_page_type(pg);
+ put_page(pg);
}
}
struct domain *rd;
struct active_grant_entry *act;
struct grant_entry *sha;
+ struct page_info *pg;
BUG_ON(!d->is_dying);
act = &active_entry(rd->grant_table, ref);
sha = &shared_entry(rd->grant_table, ref);
+ pg = mfn_to_page(act->frame);
if ( map->flags & GNTMAP_readonly )
{
BUG_ON(!(act->pin & GNTPIN_devr_mask));
act->pin -= GNTPIN_devr_inc;
if ( !is_iomem_page(act->frame) )
- put_page(mfn_to_page(act->frame));
+ put_page(pg);
}
if ( map->flags & GNTMAP_host_map )
act->pin -= GNTPIN_hstr_inc;
if ( gnttab_release_host_mappings(d) &&
!is_iomem_page(act->frame) )
- put_page(mfn_to_page(act->frame));
+ put_page(pg);
}
}
else
BUG_ON(!(act->pin & GNTPIN_devw_mask));
act->pin -= GNTPIN_devw_inc;
if ( !is_iomem_page(act->frame) )
- put_page_and_type(mfn_to_page(act->frame));
+ put_page_and_type(pg);
}
if ( map->flags & GNTMAP_host_map )
!is_iomem_page(act->frame) )
{
if ( gnttab_host_mapping_get_page_type(map, d, rd) )
- put_page_type(mfn_to_page(act->frame));
- put_page(mfn_to_page(act->frame));
+ put_page_type(pg);
+ put_page(pg);
}
}